﻿// using System;
// using System.Collections;
// using System.Collections.Generic;
// using UnityEngine;
// using UnityEngine.Networking;
// #if UNITY_EDITOR
// using UnityEditor;
// #endif
//
// namespace Framework
// {
//     /// <summary>
//     /// 编辑器下面资源文件加载
//     /// </summary>
//     internal sealed class EditorFileLoader : MonoBehaviour, FileLoaderInterface
//     {
//         private LinkedList<AssetItem> needLoadQueue;
//         private Dictionary<AssetItem, bool> loadedAssets;
//
//         private int curLoadingCount;
//         private int maxLoadingCount;
//         private bool isPause;
//         public bool IsPause()
//         {
//             return isPause;
//         }
//
//         public void SetPause(bool pause)
//         {
//             isPause = pause;
//             if (!isPause)
//             {
//                 StartNewLoading();
//             }
//         }
//
//         ResPathChecker pathChecker;
//         public void Init()
//         {
//             isPause = false;
//             needLoadQueue = new LinkedList<AssetItem>();
//             loadedAssets = new Dictionary<AssetItem, bool>();
//             curLoadingCount = 0;
//             maxLoadingCount = 10000;
//
//             pathChecker = new ResPathChecker();
//             pathChecker.Init();
//         }
//
//         /// <summary>
//         /// 编辑器下面加载资源
//         /// </summary>
//         /// <param name="item"></param>
//         public void Load(AssetItem item)
//         {
//             if (needLoadQueue.Contains(item) || loadedAssets.ContainsKey(item))
//             {
//                 return;
//             }
//             item.Retain();
//             needLoadQueue.AddLast(item);
//             StartNewLoading();
//             pathChecker.CheckPath(item.ResPath);
//         }
//
//         private void StartNewLoading()
//         {
//             while (CanStartNew())
//             {
//                 AssetItem newItem = needLoadQueue.First.Value;
//                 needLoadQueue.RemoveFirst();
//                 if (null != newItem)
//                 {
//                     loadedAssets[newItem] = true;
//                     StartCoroutine(DoLoading(newItem));
//                 }
//             }
//         }
//
//         private IEnumerator DoLoading(AssetItem newItem)
//         {
//             curLoadingCount++;
//
//             string filePath = newItem.isPersistenUrl ? FrameworkSettings.GetPersistResPathWWW(newItem.AssetUrl) : FrameworkSettings.GetAssetFullPathForWWW(newItem.AssetUrl);
//             UnityEngine.Object assetObj = null;
//             System.Type assetType = null;
// #if UNITY_EDITOR
//             assetType = AssetTypeUtil.GetType(filePath);
//             //Logger.LogWarning("EditorFileLoader.DoLoading, TypeFromExt filePath = " + filePath + " assetType = " + assetType);
//             if (newItem.isPersistenUrl)
//             {
//                 var fileRequest = UnityWebRequestTexture.GetTexture(filePath);
//                 fileRequest.timeout = 2;
//                 yield return fileRequest.SendWebRequest();
//                 newItem.SetAssetByWebRequest(fileRequest);
//                 assetObj = DownloadHandlerTexture.GetContent(fileRequest);
//             }
//             else
//             {
//                 assetObj = (null == assetType) ? AssetDatabase.LoadMainAssetAtPath(filePath) : AssetDatabase.LoadAssetAtPath(filePath, assetType);
//             }
// #endif
//             yield return new WaitForSecondsRealtime(0.001f);
//
//             if (null == assetObj)
//             {
//                 string log = "EditorFileLoader.DoLoading, load failed, assetItem = " + newItem + " filePath = " + filePath;
//                 Logger.LogError(log);
//                 newItem.fileLoadError = log;
//             }
//             else
//             {
//                 newItem.SetEngineAssetFromEditor(assetObj, assetType);
//             }
//             newItem.IsLoadFinish = true;
//             bool loadSuccess = (string.IsNullOrEmpty(newItem.fileLoadError));
//             newItem.OnLoadedDone();
//             if (ResLogMgr.Instance.Enable)
//             {
// 	            try
// 	            {
// 		            long length = new System.IO.FileInfo(filePath).Length;
// 		            ResLogMgr.Instance.OnLoaded(newItem.ResPath, length);
//                 }
// 	            catch
// 	            {
// 		            // ignored
// 	            }
//             }
//             newItem.Release();
//             if (!loadSuccess)
//             {
//                 ResMgr.Instance.OnLoadedFailed(newItem);
//             }
//             loadedAssets.Remove(newItem);
//             curLoadingCount--;
//             StartNewLoading();
//         }
//
//         /// <summary>
//         /// 是否可以开始新的加载
//         /// </summary>
//         /// <returns></returns>
//         private bool CanStartNew()
//         {
//             return (!isPause && curLoadingCount < maxLoadingCount && needLoadQueue.Count > 0);
//         }
//
//         /// <summary>
//         /// 是否在加载
//         /// </summary>
//         /// <returns></returns>
//         public bool IsLoading()
//         {
//             return curLoadingCount > 0;
//         }
//
//         /// <summary>
//         ///某个资源单位是否在加载
//         /// </summary>
//         /// <param name="item"></param>
//         /// <returns></returns>
//         public bool IsItemInLoading(AssetItem item)
//         {
//             return loadedAssets.ContainsKey(item);
//         }
//
//         /// <summary>
//         /// 移除某个加载的资源单位
//         /// </summary>
//         /// <param name="item"></param>
//         public void RemoveAsset(AssetItem item)
//         {
//             loadedAssets.Remove(item);
//             if (needLoadQueue.Contains(item))
//             {
//                 item.Release();
//                 needLoadQueue.Remove(item);
//             }
//         }
//         public void SetUseUnityCaching(bool useCache) { }
//         public void SetMaxLoadingCount(int count) { }
//         public void SetFailRetryCount(int retryCount) { }
//     }
//
// }
//
